package utiles;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingWorker;
import GUI.acceso.LoginPruebas;
import GUI.Dialogos;
import java.awt.Toolkit;

/**
 * Clase que realiza la conexión a la base de datos en su propio hilo para evitar el bloqueo de la aplicacion.
 * @author Efren
 * @version 0.1.2
 */
public class ConexionBD extends SwingWorker<Boolean,Boolean>{
    /**Variable que almacena la conexión. */
    private static Connection db;
    
    /**
     * Comprueba si la conexión esta activa.
     * @return verdadero si lo esta y falso en caso contrario.
     */
    public static void main(String[] args){
         try {
            
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(LoginPruebas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(LoginPruebas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(LoginPruebas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(LoginPruebas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        ConexionBD con = new ConexionBD();
    }
    public static boolean estaConectado() {
        try {
            if (db.isClosed()){
                return false;
            } else {
                return true;
            }
        } catch (Exception ex) {
            Logger.getLogger(ConexionBD.class.getName()).log(Level.SEVERE, null, ex);
        }return false;
    }
    /**
     * Llamada a constructor de la clase. Inicializa la conexión.
     */
    public ConexionBD(){
       conectar();
    }
    /**
     * Método para obtener la referencia a la conexión. 
     * @return 
     */
    public Connection getConnection(){return ConexionBD.db;}
    /**
     * Método que realiza la conexión. En caso de que la conexión ya este activa no se realizan cambios.
     */
    public final void conectar(){ 
        if (db == null){
            this.doInBackground();
        }
    }
    /**
     * Método para desconectar de la base de datos.
     */
    public final void desconectar(){
        if (db != null){
            try {
                db.close();
            } catch (SQLException ex) {
                Logger.getLogger(ConexionBD.class.getName()).log(Level.SEVERE, null, ex);
            } 
        }
    }
    /**
     * Método que sobrescribe doInBackground para realizar la conexión a la base de datos.
     * @return Boolean indicando el resultado de la operación.
     */
    @Override
    protected Boolean doInBackground() {
        dialogoCargando dialogo = new dialogoCargando();
            dialogo.setLocationRelativeTo(null);
            dialogo.setVisible(true);
        try {
            StringBuilder cadenaCon = new StringBuilder();
            cadenaCon.append("jdbc:mysql://");
            cadenaCon.append(Configuracion.getInstance().getProperty(Configuracion.direccionServidor));
            cadenaCon.append(":3306/");
            cadenaCon.append(Configuracion.getInstance().getProperty(Configuracion.nombreBaseDatos));
            db = DriverManager.getConnection(cadenaCon.toString(), Configuracion.getInstance().getProperty(Configuracion.usuario), Configuracion.getInstance().getProperty(Configuracion.contraseña));
            dialogo.setVisible(false);
            dialogo.dispose();
            new LoginPruebas().setVisible(true);
            } catch (SQLException e){
                Dialogos.mostrarDialogoError("La base de datos remota no esta disponible. Error: " + e.getMessage());
                dialogo.setVisible(false);
                dialogo.dispose();
                return false;
            }
        return true;
    }
    
    @Override
    protected void done() {
        super.done();
        //Acción despues de finalizar la conexión
    }
}
